/**

给你一个整数数组 nums ，数组中的元素 互不相同 。返回该数组所有可能的子集（幂集）
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。


示例 1：

输入：nums = [1,2,3]
输出：[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
*/

class Solution {
    List<List<Integer>> res=new ArrayList();

    public List<List<Integer>> subsets(int[] nums) {
        int depth=nums.length;
         boolean[] visited=new boolean[depth];
        for(int i=0;i<=nums.length;i++){
           
            dfs(i,0,visited,new ArrayList<Integer>(),nums);
        }
        return res;
    }
    public void dfs(int n,int start,boolean[] visited,List<Integer> path,int[] nums){
        if(n==path.size()){
            res.add(new ArrayList(path));
            return;
        }
        for(int i=start;i<nums.length;i++){
            if(visited[i]){
                continue;
            }
            path.add(nums[i]);
            visited[i]=true;
            dfs(n,i+1,visited,path,nums);
            path.remove(path.size()-1);
            visited[i]=false;
        }
    }

    

//方法2
    public List<List<Integer>> subsets2(int[] nums) {
        List<List<Integer>> res=new ArrayList();
        List<Integer> first= new ArrayList();
        res.add(first);

        for(int i=0;i<nums.length;i++){
            int l=res.size(); //关键
            for(int j=0;j<l;j++){ 
             List<Integer> temp=new ArrayList<Integer>(res.get(j));
             temp.add(nums[i]);
             res.add(temp);
            }
            
        }
        return res;
    }
}